package com.bonshotels.DomainLayer.DomainModel;

import java.io.Serializable;
import java.util.Date;

/**
 * La classe Comentari nomes aplica el patro expert. Com que utilitzem el framework de persistencia
 * Hibernate i aquest utilitza reflexio per fer la seva feina les nostres classes han d'acomplir una
 * serie de propietats perque la reflexio del Hibernate pugui fer completament la seva feina, les
 * classes han de ser publiques, han de tenir un constructor public buit (si no en tenen un d'explicit
 * el per defecte ja ho es), han d'implementar Serializable, i han de tenir substituits (override) els
 * metodes equals() i hashCode() perque identifiquin les classes a partir de la seva clau natural.
 * Com que Comentari s'identifica per la seva data, l'hotel i el client, malgrat que en la fase de
 * disseny no vam definir navegabilitat de Comentari a Hotel ni de Comentari a Client a l'hora
 * d'implementar equals(), hashCode() i els mapping de Hibernate ens ha fet falta i l'hem hagut
 * d'afegir.
 * @author Marc Mauri Alloza
 */
public class Comentari implements Serializable {

	/** Identificador de versio de la classe, es un requisit de Serializable per distingir les diverses
	 * implementacions d'una classe. */
	private static final long serialVersionUID = 6503187860963717071L;

	/** La avaluacio del hotel. */
	private int avaluacio;
	
	/** La descripcio de l'avaluacio. */
	private String descripcio;
	
	/** La data en que s'ha fet el comentari. */
	private Date data;
	
	/** El Client. */
	private Client client;
	
	/** L'hotel. */
	private Hotel hotel;
	
	/**
	 * Getter de serialVersionUid.
	 *
	 * @return El serialversionuid
	 */
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((client == null) ? 0 : client.hashCode());
		result = prime * result + ((data == null) ? 0 : data.hashCode());
		result = prime * result + ((hotel == null) ? 0 : hotel.hashCode());
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Comentari other = (Comentari) obj;
		if (client == null) {
			if (other.client != null)
				return false;
		} else if (!client.equals(other.client))
			return false;
		if (data == null) {
			if (other.data != null)
				return false;
		} else if (!data.equals(other.data))
			return false;
		if (hotel == null) {
			if (other.hotel != null)
				return false;
		} else if (!hotel.equals(other.hotel))
			return false;
		return true;
	}

	/**
	 * Getter del client.
	 *
	 * @return El client
	 */
	public Client getClient() {
		return client;
	}

	/**
	 * Setter del client.
	 *
	 * @param client El nou client
	 */
	public void setClient(Client client) {
		this.client = client;
	}

	/**
	 * Getter de l'hotel.
	 *
	 * @return L'hotel
	 */
	public Hotel getHotel() {
		return hotel;
	}

	/**
	 * Setter de l'hotel.
	 *
	 * @param hotel El nou hotel
	 */
	public void setHotel(Hotel hotel) {
		this.hotel = hotel;
	}

	/**
	 * Obte l'avaluacio.
	 *
	 * @return Retorna l'avaluacio.
	 */
	int obteAvaluacio() {
		return avaluacio;
	}

	/**
	 * Getter de l'avaluacio.
	 *
	 * @return the avaluacio
	 */
	public int getAvaluacio() {
		return avaluacio;
	}

	/**
	 * Setter de l'avaluacio.
	 *
	 * @param avaluacio La nova avaluacio
	 */
	public void setAvaluacio(int avaluacio) {
		this.avaluacio = avaluacio;
	}

	/**
	 * Getter de la descripcio.
	 *
	 * @return La descripcio
	 */
	public String getDescripcio() {
		return descripcio;
	}

	/**
	 * Setter de la descripcio.
	 *
	 * @param descripcio La nova descripcio
	 */
	public void setDescripcio(String descripcio) {
		this.descripcio = descripcio;
	}

	/**
	 * Getter de la data.
	 *
	 * @return La data
	 */
	public Date getData() {
		return data;
	}

	/**
	 * Setter de la data.
	 *
	 * @param data La nova data
	 */
	public void setData(Date data) {
		this.data = data;
	}
		
}
